home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1994 / MacHack 1994.toast / MacHack™ 1987-1994 / MacHack™ '93 / Papers '93 / Macintosh as Internet Server ƒ / inetd / Libraries / MacTCPLib / TCP.cp < prev    next >
Encoding:
Text File  |  1993-03-16  |  3.8 KB  |  204 lines  |  [TEXT/MPS ]

  1.  
  2. #include "TCP.h"
  3. #include "Driver.h"
  4.  
  5. #include <myUtils.h>
  6.  
  7. #include <Memory.h>
  8.  
  9. StreamPtr
  10. tcpCreate(int bufSize, TCPNotifyProc asr, Ptr usrData)
  11. {
  12.     OSErr    theErr;
  13.     TCPiopb    pb;
  14.     Ptr        buffer;
  15.     
  16.     buffer = NewPtr(bufSize);
  17.     if (MemError() != noErr)
  18.         return MemError();    
  19.  
  20.     pb.csCode        = TCPCreate;
  21.     pb.ioCRefNum    = gRef.GetRef();
  22.     pb.ioCompletion = nil;
  23.  
  24.     pb.csParam.create.rcvBuff        = buffer;
  25.     pb.csParam.create.rcvBuffLen    = bufSize;
  26.     pb.csParam.create.notifyProc     = asr;
  27.     pb.csParam.create.userDataPtr    = usrData;
  28.  
  29.     theErr = PBControlSync((ParmBlkPtr) &pb);
  30.     
  31.     if (theErr == noErr)
  32.         return pb.tcpStream;
  33.     else
  34.         return (StreamPtr) theErr;
  35. }
  36.  
  37. OSErr
  38. tcpOpen(StreamPtr stream, ip_addr host, tcp_port port)
  39. {
  40.     TCPiopb    pb;
  41.  
  42.     BlockClear(&pb, sizeof(pb));
  43.  
  44.     pb.csCode        = TCPActiveOpen;
  45.     pb.tcpStream    = stream;
  46.     pb.ioCRefNum    = gRef.GetRef();
  47.     
  48.     pb.csParam.open.ulpTimeoutValue        = 5;
  49.     pb.csParam.open.ulpTimeoutAction    = 0;
  50.     pb.csParam.open.validityFlags        = 0xC0;
  51.     pb.csParam.open.remoteHost            = host;
  52.     pb.csParam.open.remotePort            = port;
  53.     
  54.     return PBControlSync((ParmBlkPtr) &pb);
  55. }
  56.  
  57. OSErr
  58. tcpOpenReserved(StreamPtr stream, ip_addr host, tcp_port port)
  59. {
  60.     TCPiopb        pb;
  61.     tcp_port    local;
  62.     OSErr        theErr;
  63.  
  64.     BlockClear(&pb, sizeof(pb));
  65.  
  66.     local = 1023;
  67.  
  68.     pb.csCode        = TCPActiveOpen;
  69.     pb.tcpStream    = stream;
  70.     pb.ioCRefNum    = gRef.GetRef();
  71.     
  72.     pb.csParam.open.ulpTimeoutValue        = 5;
  73.     pb.csParam.open.ulpTimeoutAction    = 0;
  74.     pb.csParam.open.validityFlags        = 0xC0;
  75.     pb.csParam.open.remoteHost            = host;
  76.     pb.csParam.open.remotePort            = port;
  77.     
  78.     do {
  79.         pb.csParam.open.localPort        = local;
  80.         
  81.         theErr = PBControlSync((ParmBlkPtr) &pb);
  82.         
  83.         local--;
  84.     } while ((theErr == duplicateSocket) && (local > 512));
  85.  
  86.     return theErr;
  87. }
  88.  
  89. OSErr
  90. tcpRead(StreamPtr stream, void* buffer, short* len)
  91. {
  92.     OSErr    theErr;
  93.     TCPiopb    pb;
  94.     
  95.     BlockClear(&pb, sizeof(pb));
  96.     
  97.     pb.ioCRefNum    = gRef.GetRef();
  98.     pb.tcpStream    = stream;
  99.     pb.csCode        = TCPRcv;
  100.     
  101.     pb.csParam.receive.commandTimeoutValue    = 2;
  102.     pb.csParam.receive.rcvBuff                = (Ptr) buffer;
  103.     pb.csParam.receive.rcvBuffLen            = (unsigned short) *len;
  104.     
  105.     theErr = PBControlSync((ParmBlkPtr) &pb);
  106.     
  107.     if (theErr == noErr) 
  108.         *len = pb.csParam.receive.rcvBuffLen;
  109.     else
  110.         *len = 0;
  111.         
  112.     return theErr;
  113. }
  114.  
  115. OSErr
  116. tcpWrite(StreamPtr stream, void* buffer, short len)
  117. {
  118.     typedef struct OneWDS {
  119.         wdsEntry        wds;
  120.         unsigned short    zero;
  121.     } OneWDS;
  122.  
  123.     TCPiopb    pb;
  124.     OneWDS    wds;
  125.     
  126.     BlockClear(&pb, sizeof(pb));
  127.  
  128.     wds.zero         = 0;
  129.     wds.wds.ptr     = buffer;
  130.     wds.wds.length    = len;
  131.  
  132.     pb.ioCRefNum    = gRef.GetRef();
  133.     pb.tcpStream    = stream;
  134.     pb.csCode         = TCPSend;
  135.     
  136.     pb.csParam.send.ulpTimeoutValue        = 2;
  137.     pb.csParam.send.ulpTimeoutAction    = 1;
  138.     pb.csParam.send.validityFlags        = 0xC0;
  139.     pb.csParam.send.wdsPtr                = (Ptr) &wds;
  140.     
  141.     return PBControlSync((ParmBlkPtr) &pb);
  142. }
  143.  
  144. OSErr
  145. tcpWriteWDS(StreamPtr stream, wdsEntry* wds)
  146. {
  147.     TCPiopb    pb;
  148.  
  149.     BlockClear(&pb, sizeof(pb));
  150.  
  151.     pb.ioCRefNum    = gRef.GetRef();
  152.     pb.tcpStream    = stream;
  153.     pb.csCode         = TCPSend;
  154.     
  155.     pb.csParam.send.ulpTimeoutValue        = 2;
  156.     pb.csParam.send.ulpTimeoutAction    = 1;
  157.     pb.csParam.send.validityFlags        = 0xC0;
  158.     pb.csParam.send.wdsPtr                = (Ptr) wds;
  159.     
  160.     return PBControlSync((ParmBlkPtr) &pb);
  161. }
  162.  
  163. OSErr
  164. tcpClose(StreamPtr stream)
  165. {
  166.     OSErr    theErr;
  167.     TCPiopb    pb;
  168.  
  169.     pb.ioCompletion    = nil;
  170.     pb.ioCRefNum    = gRef.GetRef();
  171.     pb.tcpStream    = stream;
  172.     pb.csCode         = TCPClose;
  173.     
  174.     pb.csParam.close.ulpTimeoutValue     = 5;
  175.     pb.csParam.close.ulpTimeoutAction    = 1;
  176.     pb.csParam.close.validityFlags        = 0xC0;
  177.     pb.csParam.close.userDataPtr        = nil;
  178.     
  179.     theErr = PBControlSync((ParmBlkPtr) &pb);
  180.     
  181.     if (theErr == noErr) {
  182.         pb.csCode = TCPRelease;
  183.         theErr = PBControlSync((ParmBlkPtr) &pb);
  184.     }
  185.     
  186.     if (theErr == noErr) {
  187.         DisposePtr(pb.csParam.create.rcvBuff);
  188.         theErr = MemError();
  189.     }
  190.  
  191.     return theErr;
  192. }
  193.  
  194. OSErr
  195. tcpStatus(StreamPtr stream, TCPiopb* pb)
  196. {
  197.     pb->ioCRefNum    = gRef.GetRef();
  198.     pb->tcpStream    = stream;
  199.     pb->csCode        = TCPStatus;
  200.  
  201.     return PBControlSync((ParmBlkPtr) pb);
  202. }
  203.  
  204.